package com.cskaoyan.javase.oop2._1extends._10final._3variable._2member;
/**
 * final修饰成员变量,表示成员常量,它仍然属于对象
 * 语法:
 *      [访问权限修饰符] final 数据类型 变量名;
 * final修饰成员变量后,该成员变量的默认初始化就不再有了,没有默认值了,必须依赖于手动初始化赋值!
 * 既然是成员常量,肯定需要有一个值,那么在创建对象过程中,除了默认初始化,还有:
 *      1.显式赋值
 *      2.构造器
 *      3.构造代码块
 *
 * 以上三种赋值方式必须选择其一,而且也最多选择其一!!
 * 尤其注意,当你选择用构造器赋值时,必须要求所有构造器都能够完成该成员常量的赋值(因为一个构造器,就是一种new对象的方式)
 *
 *
 * 思考:
 *      final修饰的成员变量,表示成员常量,它是不是一个真正意义上的常量?
 *          不是,因为它属于对象,每个对象都可能有不同取值的一个成员常量,不是真正意义上的常量
 *          所以实际开发中,如果需要一个真的常量,一般不使用成员常量
 *          而是使用final修饰的静态成员变量
 *          它全局唯一,又是一个常量
 *          是真正意义上的常量!!!
 *
 *
 * @since 11:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.age);
        // s.age = 100;

        Student s2 = new Student(18);
        System.out.println(s2.age);
    }
}
class Student{
    // Variable 'age' might not have been initialized
    final int age ;
    {
    }

    public Student(int age) {
        this.age = age;
    }

    public Student() {
        age = 19;
    }
}